package modeladesktop.gui;
import javax.swing.table.*;
import java.util.*;

public class ModeloData extends AbstractTableModel{

	private ArrayList <ArrayList <Double>> mapa = new ArrayList <ArrayList <Double>> ();
	private Object [] cabeceras = null;

	public ModeloData(Object [] cabeceras){
		this.cabeceras = cabeceras;
	}

	public boolean hasNullValues(){
		boolean nulo = false;
		for(ArrayList <Double> fila : mapa)
			for(Double dato : fila)
				if(dato == null)
					return true;
		return false;
	}

	public ArrayList <double[]> paraANOVA(Object nombres[]){
		ArrayList <double[]> anovaData = new ArrayList <double[]> ();
		for(int i = 0; i < nombres.length; i++){
			for(int j = 0; j < cabeceras.length; j++)
				if(cabeceras[j].toString().equals(nombres[i].toString())){
					double [] data = new double[mapa.size()];
					for(int k = 0; k < mapa.size(); k++){
						data[k] = mapa.get(k).get(j);
					}
					anovaData.add(data);
				}
		}
		return anovaData;
	}

	public double[] getDependiente(Object nombre){
		double data[] = new double[mapa.size()];
		for(int i = 0; i<cabeceras.length; i++)
			if(cabeceras[i].toString().equals(nombre.toString())){
				for(int j = 0; j < mapa.size(); j++)
					data[j] = mapa.get(j).get(i);
				break;
			}
		return data;
	}

	public void saveData(Object nombre, int col, double data[][]){
		for(int i = 0; i<cabeceras.length; i++)
			if(cabeceras[i].toString().equals(nombre.toString())){
				for(int j = 0; j < mapa.size(); j++)
					data[j][col] = mapa.get(j).get(i);
				break;
			}
	}

	public double[][] getIndependientes(Object nombres[]){
		double data [][] = new double[mapa.size()][nombres.length+1];
		for(int i = 0; i<mapa.size(); i++)// agrego una columna mas para una columna de '1'
			data[i][0] = 1;
		for(int i = 0; i < nombres.length; i++)
			saveData(nombres[i], i+1, data);
		return data;
	}

	public double[][] getXsY(Object nombres[], Object y){
		double data[][] = new double[mapa.size()][nombres.length+1];
		saveData(y, 0, data);
		for(int i = 0; i < nombres.length; i++)
			saveData(nombres[i], i+1, data);
		return data;
	}

	public double[][] getXYForRegresionSimple(Object x, Object y){
		double data[][] = new double[mapa.size()][2];
		saveData(x, 0, data);
		saveData(y, 1, data);
		return data;
	}

	public void addRow(){
		ArrayList <Double> row = new ArrayList <Double> ();
		for(int i = 0; i< cabeceras.length; i++)
			row.add(null);
		int pos = mapa.size();
		mapa.add(row);
		fireTableRowsInserted(pos, pos + 1);
	}

	public void removeRow(int row){
		mapa.remove(row);
		int pos = mapa.size();
		fireTableRowsDeleted(pos, pos + 1);
	}

	public void setDatos(ArrayList <ArrayList <Double>> mapa){
		this.mapa = mapa;
		fireTableRowsInserted(0, mapa.size());
	}

	@Override
	public boolean isCellEditable(int row, int col){
		if(col == 0)
			return false;
		else
			return true;
	}

	@Override
	public int getRowCount(){
		return mapa.size();
	}

	@Override
	public String getColumnName(int col){
		if(col == 0)
			return "Numero";
		else
			return cabeceras[col-1].toString();
	}

	@Override
	public int getColumnCount(){
		return cabeceras.length + 1;
	}

	@Override
	public Object getValueAt(int row, int col){
		if(col == 0)
			return row+1;
		else
			return mapa.get(row).get(col-1);
	}

	@Override
	public Class getColumnClass(int col){
		if(col == 0)
			return String.class;
		return Double.class;
	}

	@Override
	public void setValueAt(Object value, int row, int col){
		if(value == null)
			mapa.get(row).set(col-1, null);
		else {
			Double data = Double.parseDouble(value.toString());
			mapa.get(row).set(col-1, data);
		}
	}
}
